第4章 ジュリア集合
● Newton 法 ジュリア集合の説明の前に、Newton 法について書いておきます。 Newton 法というのは、連続で微分可能な関数 f(x) について、f(x)=0 という 代数方程式の解を数値計算で求めるときに使われるアルゴリズムの 1 つです。 実数の範囲で考えると、f(x)=0 の解は y=f(x) のグラフと X 軸の交点の X 座標です。y=f(x) のグラフを描き、(x0,f(x0)) という座標で接線を引くと、点 (x0-f(x0)/f'(x0),0) で接線と X 軸が交わります(ここで f'(x) は f(x) の導 関数(1 回微分した関数)です)。(x0,0) よりも (x0-f(x0)/f'(x0),0) のほう が解(グラフと X 軸の交点)に近くなる場合が多いので、 x(n+1) = x(n) - f(x(n))/f'(x(n)) という漸化式を繰り返すことで f(x)=0 の解を近似することができるというわけ です。これが Newton 法です。 Newton 法は漸化式を使っているので、初期値が必要です。初期値の選びかた によって、解に十分近づけるまでに漸化式を繰り返さなければならない回数が変 わってきます。 Newton 法では解を求めることができない場合があります。それは、漸化式を 計算できなくなる場合と、漸化式を何度繰り返しても解に収束しない場合です。 ● Newton 法の漸化式を計算できなくなる場合とは f'(x(n)) が 0 になってしまうと、Newton 法の漸化式を計算することができ なくなります。例えば、 f(x) = x^2-1 のとき、f'(0)=0 なので、初期値として 0 を使うことはできません。この場合 は 0 以外の初期値から始めれば必ず解に収束します。正の初期値ならば +1 に、 負の初期値ならば -1 が求まります。 ● Newton 法の漸化式を何度繰り返しても解に収束しない場合とは 稀に、x(n+m)=x(n) となって Newton 法の漸化式の軌道がループに陥ってしま い、漸化式をいくら繰り返しても解に収束しない場合があります。例えば、 f(x) = x^3-x の場合について考えます。このとき f'(x) = 3*x^2-1 なので、Newton 法の漸化式は x(n+1) = x(n) - {x(n)^3-x(n)} / (3*x(n)^2-1) = x(n) * {1 - (x(n)^2 - 1) / (3*x(n)^2-1)} です。初期値を x(0) = 1/√5 とすると、 x(1) = 1/√5 * {1 - (1/5 - 1) / (3/5-1)} = 1/√5 * {1 - (4/5) / (2/5)} = 1/√5 * {1 - 2} = -1/√5 となります。これをもう 1 度漸化式に代入すると、 x(2) = -1/√5 * {1 - (1/5 - 1) / (3/5-1)} = -1/√5 * {1 - (4/5) / (2/5)} = -1/√5 * {1 - 2} = 1/√5 = x(0) となってしまいます。これでは漸化式を何度繰り返しても 1/√5 と -1/√5 を いったりきたりするだけで解に収束しません。 漸化式の軌道が解に収束せず、ループに陥ってしまった場合は、解を求めるこ とができません。ループもせず、ほとんどランダムに見えるような軌道になる場 合もあるようです。本来はループに陥るはずの初期値を与えても、演算の誤差で ループから外れる場合があります。 ● Newton 法を複素数の範囲で使う 最初の y=f(x) のグラフによる説明では Newton 法は実数の範囲で使うものの ように思われますが、実際には Newton 法は複素数の範囲でも適用することがで きます。複素数の解が存在する場合は、複素数の初期値を与えることで複素数の 解を求めることができます。 例えば、 f(x) = x^2+1 のときは実数の解が存在しないので実数の初期値を与えても解に到達できません が、虚数部が 0 でない複素数の初期値を与えれば、±i のどちらかの解に到達 することができます。 f(x) の各項の係数が複素数になっていても構いません。 ●ジュリア集合 「代数方程式の解を Newton 法を使って複素数の範囲で求めるとき、解を求め ることができない初期値の集合」をジュリア集合と呼びます。解を求めることが できない場合というのは、前述のように、途中で f'(x(n))=0 となって Newton 法の漸化式を計算できなくなるか、漸化式を何度繰り返しても解に収束しない場 合です。 ◎ f(x)=x^3-1 のジュリア集合 上の例では、白っぽくなっているところがジュリア集合に近いところです。こ の関数の場合は実際のジュリア集合の領域に太さがないため、コンピュータの画 面上では真っ黒い点(ジュリア集合の内部と見なされる点)はほとんど現れませ ん。 ●穴のあいたジュリア集合を探せ 私はジュリア集合の内部もマンデルブロ集合と同様に真っ黒に塗り潰すことに しているので、ある程度の広さを持ったジュリア集合が現れることを「穴があく」 と言っています。その穴をあけるのが結構大変なのです。 定義からわかるように、ジュリア集合は代数方程式毎に存在する集合です。し かし、代数方程式の係数をでたらめに選んだのでは、そう簡単に穴のあいたジュ リア集合の画像を拝むことはできません。 そこで、次のようなアプローチを試みます。例えば、原点の場所に穴があくよ うにするには、初期値が 0 のところにジュリア集合が現れるような関数を見つ ければよいわけです。そこで、今までのように初期値を複素平面にマップするの ではなく、関数の定数項を複素平面にマップして、初期値を 0 に固定して Newton 法の漸化式を適用します。ジュリア集合は代数方程式毎に存在するもの ですが、定数項の異なる代数方程式の初期値が 0 の場所のジュリア集合のテス トの結果を複素平面に描いてしまうわけです。 例えば、f(x)=x^3-x+c という関数について初期値 0 でジュリア集合の Newton 法を実行すると、次のような画像が得られます。 ◎ f(x)=x^3-x+c を初期値 0 で定数項について描く よく見ると、画面の左右に黒い穴があいているところがあります。ちょうど 3 のところに穴があいているので、それを定数項に代入して、f(x)=x^3-x+3 とい う関数のジュリア集合を表示してみます。 ◎ f(x)=x^3-x+3 のジュリア集合 見事に穴があきましたね。原点のところを拡大してみると、こんな感じになって います。 ◎ f(x)=x^3-x+3 のジュリア集合(拡大) ●意外なものが f(x)=x^3-x+c のジュリア集合を初期値 0 で定数項について描いたときに見た 左右の黒い穴ですが、そこを拡大してみるとこのような画像が得られます。 ◎ f(x)=x^3-x+c の定数項(拡大) これはマンデルブロ集合にそっくりです。ジュリア集合を出現させる関数の定数 項の集合の中には、どういうわけかマンデルブロ集合が現れることがあるのです。 関係なさそうに見えるマンデルブロ集合とジュリア集合にいったいどういう関係 があるのか、不思議ですね。 ● 3 次方程式のジュリア集合を表示するプログラムのソースリスト このプログラムは C で書いてあります。 ◎ julia3.c 3次方程式のジュリア集合のプログラム ◎ julia3c.c 3次方程式のジュリア集合を定数項について表示するプログラム ● 3 次方程式のジュリア集合を表示してみる ここでは、実際にプログラムを実行して 3 次方程式のジュリア集合を表示ま たは定数項について表示することができます。間違ったパラメータを指定すると 正常に動作しなかったり終了するまでに非常に時間がかかったりするので注意し て下さい。 なお、このプログラムは、1 ラスタ表示する毎にキー入力をチェックして、何 かキーが押されていたらそのラスタで終了するようになっています。 ● 3 次方程式のジュリア集合を表示してみる =非対応メニューです ● 3 次方程式のジュリア集合を定数項について表示してみる =非対応メニューです (EOF)